import {
    a as createElementBlock,
    b as createBaseVNode,
    c as createBlock,
    d as defineComponent,
    D as withModifiers,
    e as ref,
    F as Fragment,
    G as api,
    J as mergeModels,
    j as renderList,
    K as onMounted,
    k as createCommentVNode,
    L as withDirectives,
    m as useModel,
    n as normalizeClass,
    o as openBlock,
    P as vModelText,
    p as withCtx,
    q as createVNode,
    r as resolveComponent,
    s as _sfc_main$5,
    t as toDisplayString,
    u as unref,
    v as createTextVNode,
    w as watch,
    y as isRef
} from "./index-Dfdf_Rjk.js";
import {_ as _sfc_main$4} from "./SelectGroup.vue_vue_type_script_setup_true_lang-DYRZ60Lx.js";
import {_ as _sfc_main$3, g as getAllExecutorProgramList} from "./executor-Csm15pJV.js";
import {_ as _sfc_main$2} from "./SimpleInput.vue_vue_type_script_setup_true_lang-D6HMgtcH.js";
import {b as getAllTags, e as getDataBasesByPage, f as createModel, u as updateModel} from "./model-CGDRSQW4.js";
import {
    a as isJson,
    b as LRLanguage,
    c as LRParser,
    d as indentNodeProp,
    e as continuedIndent,
    E as ExternalTokenizer,
    f as foldNodeProp,
    g as ifNotIn,
    h as completeFromList,
    j as json,
    k as syntaxTree,
    L as LanguageSupport,
    l as isJsonArray,
    s as styleTags,
    t as tags,
    T
} from "./vue-codemirror.esm-Qc3mw6Aw.js";

const _hoisted_1$1 = ["placeholder"];
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
    __name: "SimpleTextarea",
    props: /* @__PURE__ */ mergeModels({
        maxlength: {},
        placeholder: {}
    }, {
        "modelValue": {},
        "modelModifiers": {}
    }),
    emits: ["update:modelValue"],
    setup(__props) {
        const value = useModel(__props, "modelValue");
        return (_ctx, _cache) => {
            return withDirectives((openBlock(), createElementBlock("textarea", {
                "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => value.value = $event),
                placeholder: _ctx.placeholder,
                class: "h-[80px] w-full resize-none appearance-none border border-transparent rounded-md bg-gray-100 px-2 py-1 font-[monaco] caret-primary outline-none focus:border hover:border focus:border-gray-300 hover:border-gray-300 focus:bg-gray-50 hover:bg-gray-50 placeholder:text-gray-400"
            }, null, 8, _hoisted_1$1)), [
                [vModelText, value.value]
            ]);
        };
    }
});
const whitespace = 36, LineComment = 1, BlockComment = 2, String$1 = 3, Number = 4, Bool = 5, Null = 6, ParenL = 7,
    ParenR = 8, BraceL = 9, BraceR = 10, BracketL = 11, BracketR = 12, Semi = 13, Dot = 14, Operator = 15,
    Punctuation = 16, SpecialVar = 17, Identifier = 18, QuotedIdentifier = 19, Keyword = 20, Type = 21, Bits = 22,
    Bytes = 23, Builtin = 24;

function isAlpha(ch) {
    return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 || ch >= 48 && ch <= 57;
}

function isHexDigit(ch) {
    return ch >= 48 && ch <= 57 || ch >= 97 && ch <= 102 || ch >= 65 && ch <= 70;
}

function readLiteral(input, endQuote, backslashEscapes) {
    for (let escaped = false; ;) {
        if (input.next < 0)
            return;
        if (input.next == endQuote && !escaped) {
            input.advance();
            return;
        }
        escaped = backslashEscapes && !escaped && input.next == 92;
        input.advance();
    }
}

function readDoubleDollarLiteral(input, tag) {
    scan: for (; ;) {
        if (input.next < 0)
            return;
        if (input.next == 36) {
            input.advance();
            for (let i = 0; i < tag.length; i++) {
                if (input.next != tag.charCodeAt(i))
                    continue scan;
                input.advance();
            }
            if (input.next == 36) {
                input.advance();
                return;
            }
        } else {
            input.advance();
        }
    }
}

function readPLSQLQuotedLiteral(input, openDelim) {
    let matchingDelim = "[{<(".indexOf(String.fromCharCode(openDelim));
    let closeDelim = matchingDelim < 0 ? openDelim : "]}>)".charCodeAt(matchingDelim);
    for (; ;) {
        if (input.next < 0)
            return;
        if (input.next == closeDelim && input.peek(1) == 39) {
            input.advance(2);
            return;
        }
        input.advance();
    }
}

function readWord(input, result) {
    for (; ;) {
        if (input.next != 95 && !isAlpha(input.next))
            break;
        if (result != null)
            result += String.fromCharCode(input.next);
        input.advance();
    }
    return result;
}

function readWordOrQuoted(input) {
    if (input.next == 39 || input.next == 34 || input.next == 96) {
        let quote = input.next;
        input.advance();
        readLiteral(input, quote, false);
    } else {
        readWord(input);
    }
}

function readBits(input, endQuote) {
    while (input.next == 48 || input.next == 49)
        input.advance();
    if (endQuote && input.next == endQuote)
        input.advance();
}

function readNumber(input, sawDot) {
    for (; ;) {
        if (input.next == 46) {
            if (sawDot)
                break;
            sawDot = true;
        } else if (input.next < 48 || input.next > 57) {
            break;
        }
        input.advance();
    }
    if (input.next == 69 || input.next == 101) {
        input.advance();
        if (input.next == 43 || input.next == 45)
            input.advance();
        while (input.next >= 48 && input.next <= 57)
            input.advance();
    }
}

function eol(input) {
    while (!(input.next < 0 || input.next == 10))
        input.advance();
}

function inString(ch, str) {
    for (let i = 0; i < str.length; i++)
        if (str.charCodeAt(i) == ch)
            return true;
    return false;
}

const Space = " 	\r\n";

function keywords(keywords2, types, builtin) {
    let result = /* @__PURE__ */ Object.create(null);
    result["true"] = result["false"] = Bool;
    result["null"] = result["unknown"] = Null;
    for (let kw of keywords2.split(" "))
        if (kw)
            result[kw] = Keyword;
    for (let tp of types.split(" "))
        if (tp)
            result[tp] = Type;
    for (let kw of (builtin || "").split(" "))
        if (kw)
            result[kw] = Builtin;
    return result;
}

const SQLTypes = "array binary bit boolean char character clob date decimal double float int integer interval large national nchar nclob numeric object precision real smallint time timestamp varchar varying ";
const SQLKeywords = "absolute action add after all allocate alter and any are as asc assertion at authorization before begin between both breadth by call cascade cascaded case cast catalog check close collate collation column commit condition connect connection constraint constraints constructor continue corresponding count create cross cube current current_date current_default_transform_group current_transform_group_for_type current_path current_role current_time current_timestamp current_user cursor cycle data day deallocate declare default deferrable deferred delete depth deref desc describe descriptor deterministic diagnostics disconnect distinct do domain drop dynamic each else elseif end end-exec equals escape except exception exec execute exists exit external fetch first for foreign found from free full function general get global go goto grant group grouping handle having hold hour identity if immediate in indicator initially inner inout input insert intersect into is isolation join key language last lateral leading leave left level like limit local localtime localtimestamp locator loop map match method minute modifies module month names natural nesting new next no none not of old on only open option or order ordinality out outer output overlaps pad parameter partial path prepare preserve primary prior privileges procedure public read reads recursive redo ref references referencing relative release repeat resignal restrict result return returns revoke right role rollback rollup routine row rows savepoint schema scroll search second section select session session_user set sets signal similar size some space specific specifictype sql sqlexception sqlstate sqlwarning start state static system_user table temporary then timezone_hour timezone_minute to trailing transaction translation treat trigger under undo union unique unnest until update usage user using value values view when whenever where while with without work write year zone ";
const defaults = {
    backslashEscapes: false,
    hashComments: false,
    spaceAfterDashes: false,
    slashComments: false,
    doubleQuotedStrings: false,
    doubleDollarQuotedStrings: false,
    unquotedBitLiterals: false,
    treatBitsAsBytes: false,
    charSetCasts: false,
    plsqlQuotingMechanism: false,
    operatorChars: "*+-%<>!=&|~^/",
    specialVar: "?",
    identifierQuotes: '"',
    caseInsensitiveIdentifiers: false,
    words: /* @__PURE__ */ keywords(SQLKeywords, SQLTypes)
};

function dialect(spec, kws, types, builtin) {
    let dialect2 = {};
    for (let prop in defaults)
        dialect2[prop] = (spec.hasOwnProperty(prop) ? spec : defaults)[prop];
    if (kws)
        dialect2.words = keywords(kws, types || "", builtin);
    return dialect2;
}

function tokensFor(d) {
    return new ExternalTokenizer((input) => {
        var _a;
        let {next} = input;
        input.advance();
        if (inString(next, Space)) {
            while (inString(input.next, Space))
                input.advance();
            input.acceptToken(whitespace);
        } else if (next == 36 && d.doubleDollarQuotedStrings) {
            let tag = readWord(input, "");
            if (input.next == 36) {
                input.advance();
                readDoubleDollarLiteral(input, tag);
                input.acceptToken(String$1);
            }
        } else if (next == 39 || next == 34 && d.doubleQuotedStrings) {
            readLiteral(input, next, d.backslashEscapes);
            input.acceptToken(String$1);
        } else if (next == 35 && d.hashComments || next == 47 && input.next == 47 && d.slashComments) {
            eol(input);
            input.acceptToken(LineComment);
        } else if (next == 45 && input.next == 45 && (!d.spaceAfterDashes || input.peek(1) == 32)) {
            eol(input);
            input.acceptToken(LineComment);
        } else if (next == 47 && input.next == 42) {
            input.advance();
            for (let depth = 1; ;) {
                let cur = input.next;
                if (input.next < 0)
                    break;
                input.advance();
                if (cur == 42 && input.next == 47) {
                    depth--;
                    input.advance();
                    if (!depth)
                        break;
                } else if (cur == 47 && input.next == 42) {
                    depth++;
                    input.advance();
                }
            }
            input.acceptToken(BlockComment);
        } else if ((next == 101 || next == 69) && input.next == 39) {
            input.advance();
            readLiteral(input, 39, true);
            input.acceptToken(String$1);
        } else if ((next == 110 || next == 78) && input.next == 39 && d.charSetCasts) {
            input.advance();
            readLiteral(input, 39, d.backslashEscapes);
            input.acceptToken(String$1);
        } else if (next == 95 && d.charSetCasts) {
            for (let i = 0; ; i++) {
                if (input.next == 39 && i > 1) {
                    input.advance();
                    readLiteral(input, 39, d.backslashEscapes);
                    input.acceptToken(String$1);
                    break;
                }
                if (!isAlpha(input.next))
                    break;
                input.advance();
            }
        } else if (d.plsqlQuotingMechanism && (next == 113 || next == 81) && input.next == 39 && input.peek(1) > 0 && !inString(input.peek(1), Space)) {
            let openDelim = input.peek(1);
            input.advance(2);
            readPLSQLQuotedLiteral(input, openDelim);
            input.acceptToken(String$1);
        } else if (next == 40) {
            input.acceptToken(ParenL);
        } else if (next == 41) {
            input.acceptToken(ParenR);
        } else if (next == 123) {
            input.acceptToken(BraceL);
        } else if (next == 125) {
            input.acceptToken(BraceR);
        } else if (next == 91) {
            input.acceptToken(BracketL);
        } else if (next == 93) {
            input.acceptToken(BracketR);
        } else if (next == 59) {
            input.acceptToken(Semi);
        } else if (d.unquotedBitLiterals && next == 48 && input.next == 98) {
            input.advance();
            readBits(input);
            input.acceptToken(Bits);
        } else if ((next == 98 || next == 66) && (input.next == 39 || input.next == 34)) {
            const quoteStyle = input.next;
            input.advance();
            if (d.treatBitsAsBytes) {
                readLiteral(input, quoteStyle, d.backslashEscapes);
                input.acceptToken(Bytes);
            } else {
                readBits(input, quoteStyle);
                input.acceptToken(Bits);
            }
        } else if (next == 48 && (input.next == 120 || input.next == 88) || (next == 120 || next == 88) && input.next == 39) {
            let quoted = input.next == 39;
            input.advance();
            while (isHexDigit(input.next))
                input.advance();
            if (quoted && input.next == 39)
                input.advance();
            input.acceptToken(Number);
        } else if (next == 46 && input.next >= 48 && input.next <= 57) {
            readNumber(input, true);
            input.acceptToken(Number);
        } else if (next == 46) {
            input.acceptToken(Dot);
        } else if (next >= 48 && next <= 57) {
            readNumber(input, false);
            input.acceptToken(Number);
        } else if (inString(next, d.operatorChars)) {
            while (inString(input.next, d.operatorChars))
                input.advance();
            input.acceptToken(Operator);
        } else if (inString(next, d.specialVar)) {
            if (input.next == next)
                input.advance();
            readWordOrQuoted(input);
            input.acceptToken(SpecialVar);
        } else if (inString(next, d.identifierQuotes)) {
            readLiteral(input, next, false);
            input.acceptToken(QuotedIdentifier);
        } else if (next == 58 || next == 44) {
            input.acceptToken(Punctuation);
        } else if (isAlpha(next)) {
            let word = readWord(input, String.fromCharCode(next));
            input.acceptToken(input.next == 46 || input.peek(-word.length - 1) == 46 ? Identifier : (_a = d.words[word.toLowerCase()]) !== null && _a !== void 0 ? _a : Identifier);
        }
    });
}

const tokens = /* @__PURE__ */ tokensFor(defaults);
const parser$1 = /* @__PURE__ */ LRParser.deserialize({
    version: 14,
    states: "%vQ]QQOOO#wQRO'#DSO$OQQO'#CwO%eQQO'#CxO%lQQO'#CyO%sQQO'#CzOOQQ'#DS'#DSOOQQ'#C}'#C}O'UQRO'#C{OOQQ'#Cv'#CvOOQQ'#C|'#C|Q]QQOOQOQQOOO'`QQO'#DOO(xQRO,59cO)PQQO,59cO)UQQO'#DSOOQQ,59d,59dO)cQQO,59dOOQQ,59e,59eO)jQQO,59eOOQQ,59f,59fO)qQQO,59fOOQQ-E6{-E6{OOQQ,59b,59bOOQQ-E6z-E6zOOQQ,59j,59jOOQQ-E6|-E6|O+VQRO1G.}O+^QQO,59cOOQQ1G/O1G/OOOQQ1G/P1G/POOQQ1G/Q1G/QP+kQQO'#C}O+rQQO1G.}O)PQQO,59cO,PQQO'#Cw",
    stateData: ",[~OtOSPOSQOS~ORUOSUOTUOUUOVROXSOZTO]XO^QO_UO`UOaPObPOcPOdUOeUOfUOgUOhUO~O^]ORvXSvXTvXUvXVvXXvXZvX]vX_vX`vXavXbvXcvXdvXevXfvXgvXhvX~OsvX~P!jOa_Ob_Oc_O~ORUOSUOTUOUUOVROXSOZTO^tO_UO`UOa`Ob`Oc`OdUOeUOfUOgUOhUO~OWaO~P$ZOYcO~P$ZO[eO~P$ZORUOSUOTUOUUOVROXSOZTO^QO_UO`UOaPObPOcPOdUOeUOfUOgUOhUO~O]hOsoX~P%zOajObjOcjO~O^]ORkaSkaTkaUkaVkaXkaZka]ka_ka`kaakabkackadkaekafkagkahka~Oska~P'kO^]O~OWvXYvX[vX~P!jOWnO~P$ZOYoO~P$ZO[pO~P$ZO^]ORkiSkiTkiUkiVkiXkiZki]ki_ki`kiakibkickidkiekifkigkihki~Oski~P)xOWkaYka[ka~P'kO]hO~P$ZOWkiYki[ki~P)xOasObsOcsO~O",
    goto: "#hwPPPPPPPPPPPPPPPPPPPPPPPPPPx||||!Y!^!d!xPPP#[TYOZeUORSTWZbdfqT[OZQZORiZSWOZQbRQdSQfTZgWbdfqQ^PWk^lmrQl_Qm`RrseVORSTWZbdfq",
    nodeNames: "⚠ LineComment BlockComment String Number Bool Null ( ) { } [ ] ; . Operator Punctuation SpecialVar Identifier QuotedIdentifier Keyword Type Bits Bytes Builtin Script Statement CompositeIdentifier Parens Braces Brackets Statement",
    maxTerm: 38,
    nodeProps: [
        ["isolate", -4, 1, 2, 3, 19, ""]
    ],
    skippedNodes: [0, 1, 2],
    repeatNodeCount: 3,
    tokenData: "RORO",
    tokenizers: [0, tokens],
    topRules: {"Script": [0, 25]},
    tokenPrec: 0
});

function tokenBefore(tree) {
    let cursor = tree.cursor().moveTo(tree.from, -1);
    while (/Comment/.test(cursor.name))
        cursor.moveTo(cursor.from, -1);
    return cursor.node;
}

function idName(doc, node) {
    let text = doc.sliceString(node.from, node.to);
    let quoted = /^([`'"])(.*)\1$/.exec(text);
    return quoted ? quoted[2] : text;
}

function plainID(node) {
    return node && (node.name == "Identifier" || node.name == "QuotedIdentifier");
}

function pathFor(doc, id) {
    if (id.name == "CompositeIdentifier") {
        let path = [];
        for (let ch = id.firstChild; ch; ch = ch.nextSibling)
            if (plainID(ch))
                path.push(idName(doc, ch));
        return path;
    }
    return [idName(doc, id)];
}

function parentsFor(doc, node) {
    for (let path = []; ;) {
        if (!node || node.name != ".")
            return path;
        let name = tokenBefore(node);
        if (!plainID(name))
            return path;
        path.unshift(idName(doc, name));
        node = tokenBefore(name);
    }
}

function sourceContext(state, startPos) {
    let pos = syntaxTree(state).resolveInner(startPos, -1);
    let aliases = getAliases(state.doc, pos);
    if (pos.name == "Identifier" || pos.name == "QuotedIdentifier" || pos.name == "Keyword") {
        return {
            from: pos.from,
            quoted: pos.name == "QuotedIdentifier" ? state.doc.sliceString(pos.from, pos.from + 1) : null,
            parents: parentsFor(state.doc, tokenBefore(pos)),
            aliases
        };
    }
    if (pos.name == ".") {
        return {from: startPos, quoted: null, parents: parentsFor(state.doc, pos), aliases};
    } else {
        return {from: startPos, quoted: null, parents: [], empty: true, aliases};
    }
}

const EndFrom = /* @__PURE__ */ new Set(/* @__PURE__ */ "where group having order union intersect except all distinct limit offset fetch for".split(" "));

function getAliases(doc, at) {
    let statement;
    for (let parent = at; !statement; parent = parent.parent) {
        if (!parent)
            return null;
        if (parent.name == "Statement")
            statement = parent;
    }
    let aliases = null;
    for (let scan = statement.firstChild, sawFrom = false, prevID = null; scan; scan = scan.nextSibling) {
        let kw = scan.name == "Keyword" ? doc.sliceString(scan.from, scan.to).toLowerCase() : null;
        let alias = null;
        if (!sawFrom) {
            sawFrom = kw == "from";
        } else if (kw == "as" && prevID && plainID(scan.nextSibling)) {
            alias = idName(doc, scan.nextSibling);
        } else if (kw && EndFrom.has(kw)) {
            break;
        } else if (prevID && plainID(scan)) {
            alias = idName(doc, scan);
        }
        if (alias) {
            if (!aliases)
                aliases = /* @__PURE__ */ Object.create(null);
            aliases[alias] = pathFor(doc, prevID);
        }
        prevID = /Identifier$/.test(scan.name) ? scan : null;
    }
    return aliases;
}

function maybeQuoteCompletions(quote, completions) {
    if (!quote)
        return completions;
    return completions.map((c) => Object.assign(Object.assign({}, c), {
        label: c.label[0] == quote ? c.label : quote + c.label + quote,
        apply: void 0
    }));
}

const Span = /^\w*$/, QuotedSpan = /^[`'"]?\w*[`'"]?$/;

function isSelfTag(namespace) {
    return namespace.self && typeof namespace.self.label == "string";
}

class CompletionLevel {
    constructor(idQuote, idCaseInsensitive) {
        this.idQuote = idQuote;
        this.idCaseInsensitive = idCaseInsensitive;
        this.list = [];
        this.children = void 0;
    }

    child(name) {
        let children = this.children || (this.children = /* @__PURE__ */ Object.create(null));
        let found = children[name];
        if (found)
            return found;
        if (name && !this.list.some((c) => c.label == name))
            this.list.push(nameCompletion(name, "type", this.idQuote, this.idCaseInsensitive));
        return children[name] = new CompletionLevel(this.idQuote, this.idCaseInsensitive);
    }

    maybeChild(name) {
        return this.children ? this.children[name] : null;
    }

    addCompletion(option) {
        let found = this.list.findIndex((o) => o.label == option.label);
        if (found > -1)
            this.list[found] = option;
        else
            this.list.push(option);
    }

    addCompletions(completions) {
        for (let option of completions)
            this.addCompletion(typeof option == "string" ? nameCompletion(option, "property", this.idQuote, this.idCaseInsensitive) : option);
    }

    addNamespace(namespace) {
        if (Array.isArray(namespace)) {
            this.addCompletions(namespace);
        } else if (isSelfTag(namespace)) {
            this.addNamespace(namespace.children);
        } else {
            this.addNamespaceObject(namespace);
        }
    }

    addNamespaceObject(namespace) {
        for (let name of Object.keys(namespace)) {
            let children = namespace[name], self = null;
            let parts = name.replace(/\\?\./g, (p) => p == "." ? "\0" : p).split("\0");
            let scope = this;
            if (isSelfTag(children)) {
                self = children.self;
                children = children.children;
            }
            for (let i = 0; i < parts.length; i++) {
                if (self && i == parts.length - 1)
                    scope.addCompletion(self);
                scope = scope.child(parts[i].replace(/\\\./g, "."));
            }
            scope.addNamespace(children);
        }
    }
}

function nameCompletion(label, type, idQuote, idCaseInsensitive) {
    if (new RegExp("^[a-z_][a-z_\\d]*$", idCaseInsensitive ? "i" : "").test(label))
        return {label, type};
    return {label, type, apply: idQuote + label + idQuote};
}

function completeFromSchema(schema, tables, schemas, defaultTableName, defaultSchemaName, dialect2) {
    var _a;
    let idQuote = ((_a = dialect2 === null || dialect2 === void 0 ? void 0 : dialect2.spec.identifierQuotes) === null || _a === void 0 ? void 0 : _a[0]) || '"';
    let top = new CompletionLevel(idQuote, !!(dialect2 === null || dialect2 === void 0 ? void 0 : dialect2.spec.caseInsensitiveIdentifiers));
    let defaultSchema = defaultSchemaName ? top.child(defaultSchemaName) : null;
    top.addNamespace(schema);
    if (tables)
        (defaultSchema || top).addCompletions(tables);
    if (schemas)
        top.addCompletions(schemas);
    if (defaultSchema)
        top.addCompletions(defaultSchema.list);
    if (defaultTableName)
        top.addCompletions((defaultSchema || top).child(defaultTableName).list);
    return (context) => {
        let {parents, from, quoted, empty, aliases} = sourceContext(context.state, context.pos);
        if (empty && !context.explicit)
            return null;
        if (aliases && parents.length == 1)
            parents = aliases[parents[0]] || parents;
        let level = top;
        for (let name of parents) {
            while (!level.children || !level.children[name]) {
                if (level == top && defaultSchema)
                    level = defaultSchema;
                else if (level == defaultSchema && defaultTableName)
                    level = level.child(defaultTableName);
                else
                    return null;
            }
            let next = level.maybeChild(name);
            if (!next)
                return null;
            level = next;
        }
        let quoteAfter = quoted && context.state.sliceDoc(context.pos, context.pos + 1) == quoted;
        let options = level.list;
        if (level == top && aliases)
            options = options.concat(Object.keys(aliases).map((name) => ({label: name, type: "constant"})));
        return {
            from,
            to: quoteAfter ? context.pos + 1 : void 0,
            options: maybeQuoteCompletions(quoted, options),
            validFor: quoted ? QuotedSpan : Span
        };
    };
}

function completionType(tokenType) {
    return tokenType == Type ? "type" : tokenType == Keyword ? "keyword" : "variable";
}

function completeKeywords(keywords2, upperCase, build) {
    let completions = Object.keys(keywords2).map((keyword) => build(upperCase ? keyword.toUpperCase() : keyword, completionType(keywords2[keyword])));
    return ifNotIn(["QuotedIdentifier", "SpecialVar", "String", "LineComment", "BlockComment", "."], completeFromList(completions));
}

let parser = /* @__PURE__ */ parser$1.configure({
    props: [
        /* @__PURE__ */ indentNodeProp.add({
            Statement: /* @__PURE__ */ continuedIndent()
        }),
        /* @__PURE__ */ foldNodeProp.add({
            Statement(tree, state) {
                return {from: Math.min(tree.from + 100, state.doc.lineAt(tree.from).to), to: tree.to};
            },
            BlockComment(tree) {
                return {from: tree.from + 2, to: tree.to - 2};
            }
        }),
        /* @__PURE__ */ styleTags({
            Keyword: tags.keyword,
            Type: tags.typeName,
            Builtin: /* @__PURE__ */ tags.standard(tags.name),
            Bits: tags.number,
            Bytes: tags.string,
            Bool: tags.bool,
            Null: tags.null,
            Number: tags.number,
            String: tags.string,
            Identifier: tags.name,
            QuotedIdentifier: /* @__PURE__ */ tags.special(tags.string),
            SpecialVar: /* @__PURE__ */ tags.special(tags.name),
            LineComment: tags.lineComment,
            BlockComment: tags.blockComment,
            Operator: tags.operator,
            "Semi Punctuation": tags.punctuation,
            "( )": tags.paren,
            "{ }": tags.brace,
            "[ ]": tags.squareBracket
        })
    ]
});

class SQLDialect {
    constructor(dialect2, language, spec) {
        this.dialect = dialect2;
        this.language = language;
        this.spec = spec;
    }

    /**
     Returns the language for this dialect as an extension.
     */
    get extension() {
        return this.language.extension;
    }

    /**
     Define a new dialect.
     */
    static define(spec) {
        let d = dialect(spec, spec.keywords, spec.types, spec.builtin);
        let language = LRLanguage.define({
            name: "sql",
            parser: parser.configure({
                tokenizers: [{from: tokens, to: tokensFor(d)}]
            }),
            languageData: {
                commentTokens: {line: "--", block: {open: "/*", close: "*/"}},
                closeBrackets: {brackets: ["(", "[", "{", "'", '"', "`"]}
            }
        });
        return new SQLDialect(d, language, spec);
    }
}

function defaultKeyword(label, type) {
    return {label, type, boost: -1};
}

function keywordCompletionSource(dialect2, upperCase = false, build) {
    return completeKeywords(dialect2.dialect.words, upperCase, build || defaultKeyword);
}

function schemaCompletionSource(config) {
    return config.schema ? completeFromSchema(config.schema, config.tables, config.schemas, config.defaultTable, config.defaultSchema, config.dialect || StandardSQL) : () => null;
}

function schemaCompletion(config) {
    return config.schema ? (config.dialect || StandardSQL).language.data.of({
        autocomplete: schemaCompletionSource(config)
    }) : [];
}

function sql(config = {}) {
    let lang = config.dialect || StandardSQL;
    return new LanguageSupport(lang.language, [
        schemaCompletion(config),
        lang.language.data.of({
            autocomplete: keywordCompletionSource(lang, config.upperCaseKeywords, config.keywordCompletion)
        })
    ]);
}

const StandardSQL = /* @__PURE__ */ SQLDialect.define({});
const _hoisted_1 = {class: "form-group"};
const _hoisted_2 = {class: "form-group"};
const _hoisted_3 = {class: "form-group"};
const _hoisted_4 = {class: "form-group"};
const _hoisted_5 = ["value"];
const _hoisted_6 = {class: "form-group"};
const _hoisted_7 = ["value"];
const _hoisted_8 = {class: "form-group"};
const _hoisted_9 = ["value"];
const _hoisted_10 = {class: "form-group"};
const _hoisted_11 = ["value"];
const _hoisted_12 = {class: "form-group"};
const _hoisted_13 = {class: "flex cursor-pointer items-center justify-between rounded-md bg-gray-100 px3 py2 hover:bg-gray-200"};
const _hoisted_14 = {
    key: 0,
    class: "color-fade"
};
const _hoisted_15 = {
    key: 1,
    class: "truncate color-base op90"
};
const _hoisted_16 = {class: "form-group"};
const _hoisted_17 = {class: "form-group"};
const _sfc_main = /* @__PURE__ */ defineComponent({
    __name: "model-form",
    props: {
        type: {},
        model: {}
    },
    emits: ["success"],
    setup(__props, {emit: __emit}) {
        const props = __props;
        const emit = __emit;
        const formInfo = ref({
            modelName: "",
            modelCode: "",
            scope: "",
            modelType: "rdbms",
            executorProgramId: "",
            tags: "",
            description: "",
            record: "",
            sql: "",
            defaultParam: "",
            paramMeta: "",
            resultMeta: "",
            sourceDbId: "",
            destinationDbId: ""
        });
        const tagList = ref([]);

        function initForm() {
            if (props.model && props.type === "UPDATE") {
                formInfo.value = Object.assign({}, props.model, {
                    tags: props.model.tags || "[]",
                    defaultParam: JSON.stringify(props.model.defaultParam, null, 2) || "",
                    paramMeta: JSON.stringify(props.model.paramMeta, null, 2) || "",
                    resultMeta: JSON.stringify(props.model.resultMeta, null, 2) || ""
                });
                tagList.value = JSON.parse(formInfo.value.tags);
            }
        }

        watch(() => props.model, () => {
            initForm();
        }, {immediate: true});
        const codeStyle = {
            flex: 1,
            background: "white",
            border: "1px solid #eee",
            overflowY: "auto",
            fontSize: "0.9rem"
        };
        const allTags = ref([]);

        function getTags() {
            getAllTags().then((res) => {
                allTags.value = res.data.map((item) => item.tagName);
            }).catch(() => {
                allTags.value = [];
            });
        }

        const epList = ref([]);

        function getEpList() {
            getAllExecutorProgramList().then((res) => {
                epList.value = res.data;
            }).catch(() => {
                epList.value = [];
            });
        }

        const dbList = ref([]);

        function getDbList() {
            getDataBasesByPage({page: 1, pageSize: 100}).then((res) => {
                dbList.value = res.data;
            }).catch(() => {
                dbList.value = [];
            });
        }

        onMounted(() => {
            getTags();
            getEpList();
            getDbList();
        });

        function validateForm() {
            const {
                modelName,
                modelCode,
                modelType,
                executorProgramId,
                scope,
                sourceDbId,
                destinationDbId,
                defaultParam,
                paramMeta,
                resultMeta
            } = formInfo.value;
            if (!modelName || !modelCode || !scope || !modelType || !executorProgramId || !sourceDbId || !destinationDbId) {
                api.warn("请填写完整");
                return false;
            }
            if (defaultParam.trim() && !isJson(defaultParam.trim())) {
                api.warn("默认参数请输入正确的 JSON 格式");
                return false;
            }
            if (paramMeta.trim() && !isJsonArray(paramMeta.trim())) {
                api.warn("参数元数据请输入正确的 JSON ARRAY 格式");
                return false;
            }
            if (resultMeta.trim() && !isJsonArray(resultMeta.trim())) {
                api.warn("结果集元数据请输入正确的 JSON ARRAY 格式");
                return false;
            }
            return true;
        }

        function generateParams() {
            const params = {
                ...formInfo.value,
                tags: tagList.value
            };
            if (formInfo.value.defaultParam.trim())
                params.defaultParam = JSON.parse(formInfo.value.defaultParam.trim());
            if (formInfo.value.paramMeta.trim())
                params.paramMeta = JSON.parse(formInfo.value.paramMeta.trim());
            if (formInfo.value.resultMeta.trim())
                params.resultMeta = JSON.parse(formInfo.value.resultMeta.trim());
            return params;
        }

        function handleCreate() {
            if (!validateForm())
                return;
            const params = generateParams();
            createModel(params).then(() => {
                api.success("模型创建成功");
            });
        }

        function handleUpdate() {
            var _a;
            if (!validateForm())
                return;
            const params = generateParams();
            updateModel((_a = props.model) == null ? void 0 : _a.id, params).then(() => {
                emit("success");
                api.success("模型更新成功");
            });
        }

        return (_ctx, _cache) => {
            const _component_SimpleInput = _sfc_main$2;
            const _component_SimpleSelect = _sfc_main$3;
            const _component_SelectGroup = _sfc_main$4;
            const _component_VDropdown = resolveComponent("VDropdown");
            const _component_SimpleTextarea = _sfc_main$1;
            const _component_SimpleButton = _sfc_main$5;
            return openBlock(), createElementBlock("form", {
                class: "flex flex-col gap-5",
                onSubmit: _cache[14] || (_cache[14] = withModifiers(() => {
                }, ["prevent"]))
            }, [
                createBaseVNode("div", _hoisted_1, [
                    _cache[15] || (_cache[15] = createBaseVNode("label", null, [
                        createBaseVNode("span", {"text-red-500": ""}, "*"),
                        createTextVNode(" 模型名称 "),
                        createBaseVNode("code", {class: "color-fade"}, "(modelName)")
                    ], -1)),
                    createVNode(_component_SimpleInput, {
                        modelValue: unref(formInfo).modelName,
                        "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => unref(formInfo).modelName = $event),
                        modelModifiers: {trim: true},
                        placeholder: "请输入",
                        class: "w-full"
                    }, null, 8, ["modelValue"])
                ]),
                createBaseVNode("div", _hoisted_2, [
                    _cache[16] || (_cache[16] = createBaseVNode("label", null, [
                        createBaseVNode("span", {"text-red-500": ""}, "*"),
                        createTextVNode(" 模型代码 "),
                        createBaseVNode("code", {class: "color-fade"}, "(modelCode)")
                    ], -1)),
                    createVNode(_component_SimpleInput, {
                        modelValue: unref(formInfo).modelCode,
                        "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => unref(formInfo).modelCode = $event),
                        modelModifiers: {trim: true},
                        placeholder: "请输入",
                        class: "w-full"
                    }, null, 8, ["modelValue"])
                ]),
                createBaseVNode("div", _hoisted_3, [
                    _cache[17] || (_cache[17] = createBaseVNode("label", null, [
                        createBaseVNode("span", {"text-red-500": ""}, "*"),
                        createTextVNode(" 模型应用范围 "),
                        createBaseVNode("code", {class: "color-fade"}, "(scope)")
                    ], -1)),
                    createVNode(_component_SimpleInput, {
                        modelValue: unref(formInfo).scope,
                        "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => unref(formInfo).scope = $event),
                        modelModifiers: {trim: true},
                        placeholder: "请输入",
                        class: "w-full"
                    }, null, 8, ["modelValue"])
                ]),
                createBaseVNode("div", _hoisted_4, [
                    _cache[18] || (_cache[18] = createBaseVNode("label", null, [
                        createBaseVNode("span", {"text-red-500": ""}, "*"),
                        createTextVNode(" 模型类型 "),
                        createBaseVNode("code", {class: "color-fade"}, "(modelType)")
                    ], -1)),
                    createVNode(_component_SimpleSelect, {
                        modelValue: unref(formInfo).modelType,
                        "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => unref(formInfo).modelType = $event),
                        placeholder: "请选择"
                    }, {
                        default: withCtx(() => [
                            (openBlock(), createElementBlock(Fragment, null, renderList(["rdbms", "graph"], (item) => {
                                return createBaseVNode("option", {
                                    key: item,
                                    value: item
                                }, toDisplayString(item), 9, _hoisted_5);
                            }), 64))
                        ]),
                        _: 1
                    }, 8, ["modelValue"])
                ]),
                createBaseVNode("div", _hoisted_6, [
                    _cache[19] || (_cache[19] = createBaseVNode("label", null, [
                        createBaseVNode("span", {"text-red-500": ""}, "*"),
                        createTextVNode(" 执行程序 "),
                        createBaseVNode("code", {class: "color-fade"}, "(executorProgramId)")
                    ], -1)),
                    createVNode(_component_SimpleSelect, {
                        modelValue: unref(formInfo).executorProgramId,
                        "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => unref(formInfo).executorProgramId = $event),
                        placeholder: "请选择"
                    }, {
                        default: withCtx(() => [
                            (openBlock(true), createElementBlock(Fragment, null, renderList(unref(epList), (item) => {
                                return openBlock(), createElementBlock("option", {
                                    key: item.id,
                                    value: item.id
                                }, toDisplayString(item.executorName), 9, _hoisted_7);
                            }), 128))
                        ]),
                        _: 1
                    }, 8, ["modelValue"])
                ]),
                createBaseVNode("div", _hoisted_8, [
                    _cache[20] || (_cache[20] = createBaseVNode("label", null, [
                        createBaseVNode("span", {"text-red-500": ""}, "*"),
                        createTextVNode(" 源数据源 "),
                        createBaseVNode("code", {class: "color-fade"}, "(sourceDbId)")
                    ], -1)),
                    createVNode(_component_SimpleSelect, {
                        modelValue: unref(formInfo).sourceDbId,
                        "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => unref(formInfo).sourceDbId = $event),
                        placeholder: "请选择"
                    }, {
                        default: withCtx(() => [
                            (openBlock(true), createElementBlock(Fragment, null, renderList(unref(dbList), (item) => {
                                return openBlock(), createElementBlock("option", {
                                    key: item.id,
                                    value: item.id
                                }, toDisplayString(item.rdbName), 9, _hoisted_9);
                            }), 128))
                        ]),
                        _: 1
                    }, 8, ["modelValue"])
                ]),
                createBaseVNode("div", _hoisted_10, [
                    _cache[21] || (_cache[21] = createBaseVNode("label", null, [
                        createBaseVNode("span", {"text-red-500": ""}, "*"),
                        createTextVNode(" 目标数据源 "),
                        createBaseVNode("code", {class: "color-fade"}, "(destinationDbId)")
                    ], -1)),
                    createVNode(_component_SimpleSelect, {
                        modelValue: unref(formInfo).destinationDbId,
                        "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => unref(formInfo).destinationDbId = $event),
                        placeholder: "请选择"
                    }, {
                        default: withCtx(() => [
                            (openBlock(true), createElementBlock(Fragment, null, renderList(unref(dbList), (item) => {
                                return openBlock(), createElementBlock("option", {
                                    key: item.id,
                                    value: item.id
                                }, toDisplayString(item.rdbName), 9, _hoisted_11);
                            }), 128))
                        ]),
                        _: 1
                    }, 8, ["modelValue"])
                ]),
                createBaseVNode("div", _hoisted_12, [
                    _cache[23] || (_cache[23] = createBaseVNode("label", null, [
                        createTextVNode("模型标签 "),
                        createBaseVNode("code", {class: "color-fade"}, "(tags)")
                    ], -1)),
                    createVNode(_component_VDropdown, {
                        "auto-size": "",
                        "popper-class": "no-arrow"
                    }, {
                        popper: withCtx(() => [
                            createVNode(_component_SelectGroup, {
                                modelValue: unref(tagList),
                                "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => isRef(tagList) ? tagList.value = $event : null),
                                options: unref(allTags),
                                titles: unref(allTags).map((item) => "#".concat(item)),
                                multiple: "",
                                class: "max-h-60 w-full flex flex-col flex-nowrap overflow-y-overlay p-2 !gap-1 !text-base",
                                props: unref(allTags).map((i) => ({
                                    class: "py-1 text-0.9rem ".concat(unref(tagList).includes(i) ? "!bg-primary/10 !hover:bg-primary/10" : "!bg-base !hover:bg-hover")
                                }))
                            }, null, 8, ["modelValue", "options", "titles", "props"])
                        ]),
                        default: withCtx(() => {
                            var _a;
                            return [
                                createBaseVNode("div", _hoisted_13, [
                                    !((_a = unref(tagList)) == null ? void 0 : _a.length) ? (openBlock(), createElementBlock("span", _hoisted_14, "选择标签")) : (openBlock(), createElementBlock("span", _hoisted_15, toDisplayString(unref(tagList).map((item) => "#".concat(item)).join(", ")), 1)),
                                    _cache[22] || (_cache[22] = createBaseVNode("div", {class: "i-ph-caret-down ml-2 flex-none op40"}, null, -1))
                                ])
                            ];
                        }),
                        _: 1
                    })
                ]),
                createBaseVNode("div", _hoisted_16, [
                    _cache[24] || (_cache[24] = createBaseVNode("label", null, [
                        createTextVNode("模型描述 "),
                        createBaseVNode("code", {class: "color-fade"}, "(desciption)")
                    ], -1)),
                    createVNode(_component_SimpleTextarea, {
                        modelValue: unref(formInfo).description,
                        "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => unref(formInfo).description = $event),
                        modelModifiers: {trim: true},
                        placeholder: "请输入",
                        class: "h-60px w-full"
                    }, null, 8, ["modelValue"])
                ]),
                createBaseVNode("div", _hoisted_17, [
                    _cache[25] || (_cache[25] = createBaseVNode("label", null, [
                        createTextVNode("模型备注 "),
                        createBaseVNode("code", {class: "color-fade"}, "(record)")
                    ], -1)),
                    createVNode(_component_SimpleTextarea, {
                        modelValue: unref(formInfo).record,
                        "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => unref(formInfo).record = $event),
                        modelModifiers: {trim: true},
                        placeholder: "请输入",
                        class: "h-60px w-full"
                    }, null, 8, ["modelValue"])
                ]),
                createBaseVNode("div", {
                    class: normalizeClass(["form-group", {"h-60 min-h-60": _ctx.type === "CREATE"}])
                }, [
                    _cache[26] || (_cache[26] = createBaseVNode("label", {class: "flex items-center"}, [
                        createTextVNode(" SQL 脚本"),
                        createBaseVNode("code", {class: "color-fade"}, " (sql)"),
                        createBaseVNode("span", {class: "ml-auto yellow-badge py-2px text-sm"}, "SQL 格式")
                    ], -1)),
                    createVNode(unref(T), {
                        modelValue: unref(formInfo).sql,
                        "onUpdate:modelValue": _cache[10] || (_cache[10] = ($event) => unref(formInfo).sql = $event),
                        placeholder: "请输入",
                        style: codeStyle,
                        "indent-with-tab": true,
                        "tab-size": 4,
                        extensions: [unref(sql)()]
                    }, null, 8, ["modelValue", "extensions"])
                ], 2),
                createBaseVNode("div", {
                    class: normalizeClass(["form-group", {"h-26 min-h-26": _ctx.type === "CREATE"}])
                }, [
                    _cache[27] || (_cache[27] = createBaseVNode("label", {class: "flex items-center"}, [
                        createTextVNode(" 默认参数"),
                        createBaseVNode("code", {class: "color-fade"}, " (defaultParam)"),
                        createBaseVNode("span", {class: "ml-auto yellow-badge py-2px text-sm"}, "JSON 格式")
                    ], -1)),
                    createVNode(unref(T), {
                        modelValue: unref(formInfo).defaultParam,
                        "onUpdate:modelValue": _cache[11] || (_cache[11] = ($event) => unref(formInfo).defaultParam = $event),
                        placeholder: "请输入",
                        style: codeStyle,
                        "indent-with-tab": true,
                        "tab-size": 2,
                        extensions: [unref(json)()]
                    }, null, 8, ["modelValue", "extensions"])
                ], 2),
                createBaseVNode("div", {
                    class: normalizeClass(["form-group", {"h-40 min-h-40": _ctx.type === "CREATE"}])
                }, [
                    _cache[28] || (_cache[28] = createBaseVNode("label", {class: "flex items-center"}, [
                        createTextVNode(" 参数元数据"),
                        createBaseVNode("code", {class: "color-fade"}, " (paramMeta)"),
                        createBaseVNode("span", {class: "ml-auto yellow-badge py-2px text-sm"}, "JSON Array 格式")
                    ], -1)),
                    createVNode(unref(T), {
                        modelValue: unref(formInfo).paramMeta,
                        "onUpdate:modelValue": _cache[12] || (_cache[12] = ($event) => unref(formInfo).paramMeta = $event),
                        placeholder: "请输入",
                        style: codeStyle,
                        "indent-with-tab": true,
                        "tab-size": 2,
                        extensions: [unref(json)()]
                    }, null, 8, ["modelValue", "extensions"])
                ], 2),
                createBaseVNode("div", {
                    class: normalizeClass(["form-group", {"h-40 min-h-40": _ctx.type === "CREATE"}])
                }, [
                    _cache[29] || (_cache[29] = createBaseVNode("label", {class: "flex items-center"}, [
                        createTextVNode(" 结果集元数据"),
                        createBaseVNode("code", {class: "color-fade"}, " (resultMeta)"),
                        createBaseVNode("span", {class: "ml-auto yellow-badge py-2px text-sm"}, "JSON Array 格式")
                    ], -1)),
                    createVNode(unref(T), {
                        modelValue: unref(formInfo).resultMeta,
                        "onUpdate:modelValue": _cache[13] || (_cache[13] = ($event) => unref(formInfo).resultMeta = $event),
                        placeholder: "请输入",
                        style: codeStyle,
                        "indent-with-tab": true,
                        "tab-size": 2,
                        extensions: [unref(json)()]
                    }, null, 8, ["modelValue", "extensions"])
                ], 2),
                createBaseVNode("div", {
                    class: normalizeClass(["mt-4 flex-center", {"sticky bottom-0": _ctx.type === "UPDATE"}])
                }, [
                    _ctx.type === "CREATE" ? (openBlock(), createBlock(_component_SimpleButton, {
                        key: 0,
                        class: "!h-10",
                        type: "primary",
                        onClick: handleCreate
                    }, {
                        default: withCtx(() => _cache[30] || (_cache[30] = [
                            createTextVNode(" 创建模型 ")
                        ])),
                        _: 1
                    })) : createCommentVNode("", true),
                    _ctx.type === "UPDATE" ? (openBlock(), createBlock(_component_SimpleButton, {
                        key: 1,
                        class: "!h-10",
                        type: "primary",
                        onClick: handleUpdate
                    }, {
                        default: withCtx(() => _cache[31] || (_cache[31] = [
                            createTextVNode(" 确认更新 ")
                        ])),
                        _: 1
                    })) : createCommentVNode("", true)
                ], 2)
            ], 32);
        };
    }
});
export {
    _sfc_main as _
};
